package 力扣._3306_元音辅音字符串计数2;

import java.util.HashMap;
import java.util.Map;

class Solution {
    public long countOfSubstrings(String word, int k) {
        return count(word,k)  - count(word,k+1);
    }

    // 计算包含所有元音，且辅音至少k次的子字符串的总数
    private long count(String word, int k){
        // 滑动窗口
        String yuan = "aeiou";
        int n = word.length();
        long ans = 0;
        int j = 0;   // 窗口右边界
        int con = 0;    // 辅音数量
        Map<Character,Integer> yuanMap = new HashMap<>(); // 当前窗口内元音的数量
        for(int i=0;i<n;i++){
            while (j<n&&(yuanMap.size()<5 || con<k )){
                if(yuan.indexOf(word.charAt(j))>=0){
                    yuanMap.merge(word.charAt(j),1,Integer::sum);
                }else
                    con++;
                j++;
            }

            if(yuanMap.size()==5&&con>=k){
                ans+= n - j +1; // +1 是因为在while中满足条件后j++了
            }
            // 滑动窗口只增不减，左边界右移, 因为当前左边界所有可能的子字符串都已计算
            char left = word.charAt(i);
            if(yuan.indexOf(left)>=0){
                yuanMap.merge(left,-1,Integer::sum);
                if(yuanMap.get(left)==0)
                    yuanMap.remove(left);
            }else
                con--;

        }
        return ans;
    }
}